<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <script>
    // 原型（Prototype）：它是被设计用来做继承

    // 原型链：当我们访问p1的age属性的时候，先看p1对象中是否有自有的age属性，如果有返回该属性值
    // 如果没有，向p1的原型中继续查找，如果有返回，如果没有，继续向上查找，一直找到Object.prototype
    // 如果还没有，返回undefined。


    var obj1 = {
      name: 'liuneng'
    }
    console.log(obj1);
    // Object
    var obj2 = new Object();

    var arr1 = [1, 2, 3]
    console.log(arr1);

    var arr2 = new Array(2, 3, 4, 5)
    console.log(arr2);

    arr1.push(666)


    // 属性写到构造函数中
    function Person(name, age) {
      this.name = name
      this.age = age
    }

    // 方法写到原型中
    Person.prototype.eat = function () {
      console.log(this.name + ' is eating');
    }

    // 重要的总结：
    // 当你在prototype中定义引用类型的属性的时候，因为原型默认有查找的一个过程
    // 如果你修改了一个实例对象的这个属性的值的时候，那么会影响其它的实例对象的属性的值
    // 所以我们不要在原型中定义属性，就连基本类型的属性也不要定义

    // 如果方法放在构造函数中会有什么问题？
    // 因为在js中，function也是一个引用类型，如果将方法放在构造函数中
    // 那么每次new 构造函数的时候，都会伴随生成一个函数对象
    // 当多次new 构造函数的时候，也就意味着创建多个具有同样功能的函数对象，这个会浪费内存


    var p1 = new Person('lisi', 70);
    console.log(p1);
    p1.eat();

    var p2 = new Person('wangwu', 60)

arr1.push


  </script>
</body>

</html>